标签:
#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