题目连接:http://acm.hust.edu.cn/vjudge/contest/126708#problem/G
题目思路:这是一个完全背包问题(有n个物品,每个物品可以无限重复使用) f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v};完全背包的内循环与01背包的顺序相反。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int d[100005],a[100005],b[100005]; void inital() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(d,0,sizeof(d)); } int main() { int n,m; while((scanf("%d",&n)!=EOF)&&n>=1&&n<=100) { inital(); for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); scanf("%d",&m); for(int i=1;i<=n;i++) for(int j=b[i];j<=m;j++)//与01背包相反 d[j]=max(d[j],d[j-b[i]]+a[i]); printf("%d\n",d[m]); } return 0; }