有几个注意点:k数量循环必须降序,jj金钱遍历必须从1或0开始
code:
#include <iostream>
using namespace std;
int c[4]={0,150,200,350};
int w[4]={0,150,200,350};
int main(int argc, char *argv[])
{
int n;
scanf("%d",&n);
int i;
for(i=0;i<n;i++)
{
int m;
scanf("%d",&m);
int ii;
int dp[4][10005];
memset(dp,0,sizeof(dp));
for(ii=1;ii<=3;ii++) //商品遍历
{
int jj;
for(jj=1;jj<=m;jj++) //单价遍历
{
int k;
for(k=m/c[ii];k>=0;k--) //数量遍历
{
if(jj>=c[ii]*k) //能放入背包
{
dp[ii][jj]=max(dp[ii-1][jj],dp[ii][jj-c[ii]*k]+w[ii]*k);
}else
{
dp[ii][jj]=dp[ii-1][jj];
}
}
}
}
cout<<m-dp[3][m]<<endl;
}
return 0;
}