已知n种物品和一个可容纳C重量的背包,物品i的重量为wi,产生的效益为pi,在装包时物品i可以装入,也可以不装,但不可以拆开装。即物品i可产生的效益为xipi,这里xi为0或1。请问如何装包,能使装包总效率最大。
Input
多组测试数据。 每组第一行输入2个整数,分别为C和物品种数n 然后是n行,每行输入2个整数,分别是物品的重量wi和物品产生的效益pi
Output
对于每组数据输出1行,包含2个数分别为装包的重量及产生的效益
Sample Input
60 6
15 32
17 37
20 46
12 26
9 21
14 30
Sample Output
60 134
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <stdio.h>
//#define DEBUG
using namespace std;
int w[1010],v[1010],dp[1010];
int main()
{
#ifdef DEBUG
freopen("C:\\data.in","r",stdin);
freopen("C:\\data.out","w",stdout);
#endif
int m,n;
while(cin>>m>>n)
{
for(int i=1;i<=n;i++) cin>>w[i]>>v[i];
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=m;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
for(int i=m;i>=2;i--)
{
if(dp[i]!=dp[i-1])
{
cout<<i<<' '<<dp[i]<<endl;
break;
}
}
#ifdef DEBUG
fclose(stdin);
fclose(stdout);
#endif
}
return 0;
}