王道机试指南 例题12.8 Piggy-Bank
题目:
题目大意:
算法梳理:
这是一道“背包问题”的应用。“背包问题”分为“0-1背包问题”和“完全背包问题”。
- 0-1背包问题
- 完全背包问题
本题思路:
代码:
#include <iostream> #include <ostream> using namespace std; const int MAXN=10000; int main(){ int t; cin>>t; for(int k=0;k<t;k++){ int e,f; cin>>e>>f; int m=f-e;//相当于背包总重量 int n; cin>>n;//相当于物品件数 int v[n],w[n];//相当于每件物品的价值和重量 for(int i=0;i<n;i++) cin>>v[i]>>w[i]; int dp[m+1]; dp[0]=0;//dp[0]初始化为0 for(int j=1;j<=m;j++)//由于所求为最小值,其他dp[i]初始化为正无穷 dp[j]=MAXN; for(int i=0;i<n;i++) for(int j=w[i];j<=m;j++) dp[j]=min(dp[j],dp[j-w[i]]+v[i]);//状态转移方程 if(dp[m]==MAXN) cout<<"This is imppossible."<<endl; else cout<<"The minimum amount of money in the piggy-bank is "<<dp[m]<<"."<<endl; } return 0; }
运行结果: