标签:
#include <iostream> using namespace std; typedef struct mine{ int weight; //物品的重量 int price; //物品的价值 } mine; int main() { int num,container; mine data[25]; cin>>num>>container; while(true) { if(num==0&&container==0) break; for(int i = 0;i < num; i++) cin>>data[i].weight; for(i = 0;i < num; i++) cin>>data[i].price; for(int m = 0;m < num-1; m++) //将物品按价值排序 for(int n = 0;n < num-m-1; n++) if(data[n].price<data[n+1].price) { mine temp; temp.price = data[n].price; temp.weight = data[n].weight; data[n].price = data[n+1].price; data[n].weight = data[n+1].weight; data[n+1].price = temp.price; data[n+1].weight = temp.weight; } int sumweight = 0; int sumprice = 0; for(int k = 0;k < num; k++) if(data[k].weight<=(container-sumweight)) { sumprice += data[k].price; sumweight += data[k].weight; } cout<<sumprice<<endl; cin>>num>>container; } return 0; }
并不可以保证得到最优解,例如:
输入:
10 100
4 5 6 6 7 7 8 9 11 45
7 9 11 12 13 14 15 17 21 89
输出为192
采用动态规划算法:
#include <iostream> using namespace std; int main() { int n,c,i,j; cin>>n>>c; while(n!=0||c!=0) { int *w =new int[n]; int *p =new int[n]; int **a = new int*[n+1]; for(i=0;i<=n;i++) a[i]= new int[c+1]; for(i=0;i<n;i++) cin>>w[i]; for(j=0;j<n;j++) cin>>p[j]; for(int k=0;k<c+1;k++) a[0][k] = 0; for(i=0;i<n;i++) for(j=0;j<=c;j++) { if(w[i]>j)a[i+1][j] = a[i][j]; else if(a[i][j]<a[i][j-w[i]]+p[i]) a[i+1][j] = a[i][j-w[i]]+p[i]; else a[i+1][j] = a[i][j]; } cout<<a[n][c]<<endl; cin>>n>>c; } return 0; }
对于上述同样的输入可以得到193,原因在于可以用重量为4和5的物品代替重量为11的物品,从而获得最大的价值。
标签:
原文地址:http://www.cnblogs.com/lxk2010012997/p/4390557.html