背包问题 动态规划 HDOJ1114
/* 题目描述:无界背包问题。给定一个背包的容量W以及n种物品的价值p[i]及重量w[i],求使背包恰好装满 的物品价值的最大值,如不存在,则输出impossible。 HDOJ 1114 */ #include<iostream> #include<vector> #include<assert.h> #include<cstring> using namespace std; const int N = 500+10; struct Coin { int price; int weight; }; Coin coin[N]; int f[10000+10]; //f[i]表示背包的容量为i时所能得到的最小值。 const int INF = 10000000; int main() { int t = 0; //测试组数 int n = 0; //硬币种数 int E = 0; //储蓄罐空时的重量 int F = 0; //储蓄罐满时的重量 int totalWeight = 0; int i = 0; int j = 0; cin>>t; while (t--) { cin>>E>>F; totalWeight = F - E; cin>>n; for (i=0; i<n; i++) { cin>>coin[i].price>>coin[i].weight; } for(i=0; i<=totalWeight; i++) f[i] = INF; //容量为0时硬币价值的最小值为0; f[0] = 0; //对每个硬币都尝试装多次。 for (i=0; i<n; i++) for (j=coin[i].weight; j<=totalWeight; j++) { if (f[j] > (f[j-coin[i].weight] + coin[i].price ) ) { f[j] = f[j-coin[i].weight] + coin[i].price; } } if (f[totalWeight] == INF) { //尝试了所有硬币都不能将其恰好装满。 cout<<"This is impossible."<<endl; } else { cout<<"The minimum amount of money in the piggy-bank is "<<f[totalWeight]<<"."<<endl; } } return 0; }
多学习,多总结。