动态规划思想,具体见:维基百科
0-1背包
# include<stdio.h>
# include<string.h>
#include<math.h>
#include <iostream>
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
//0-1背包问题
int n=4;
int dp[5][11];//4个物品总重量不超过10,很节俭啊。屌丝注定孤独一生啊。。。
int w[5];
int p[5];
for(int j=1;j<=n;j++)
scanf("%d%d",&p[j],&w[j]);
for(int j=0;j<=4;j++)
for(int Y=0;Y<=10;Y++)
{
if(!j)
dp[0][Y]=0;
else
{
if(!Y)
dp[j][0]=0;
else
{
if(w[j]>Y)
dp[j][Y]=dp[j-1][Y];
else
dp[j][Y]=max(dp[j-1][Y],p[j]+dp[j-1][Y-w[j]]);
}
}
}
printf("%d\n",dp[4][10]);
}
无限背包:
# include<stdio.h>
# include<string.h>
#include<math.h>
#include <iostream>
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
//无限背包问题
int n,W;
int p[10005];
int w[10005];
int a[10005];
scanf("%d%d",&W,&n);
for(int j=1;j<=n;j++)
scanf("%d%d",&p[j],&w[j]);
a[0]=0;
for(int i=1;i<=W;i++)
{
int maxx=-1000;
for(int k=1;k<=n;k++)
{
if(w[k]<=i)
maxx=max(p[k]+a[i-w[k]],maxx);
}
a[i]=max(a[i-1],maxx);
}
printf("%d\n",a[W]);
}