3 3 3 7 7 9 9 10 5 1 1 5 3 10 3 6 8 7 5 6
10 20
一开始我还以为是贪心问题,但WA了几次后,从网上才知道是完全背包问题,直接用动规方程
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
其中w[i]为重量,v[i]为价值,如果不拿当前j重量的东西,则价值为dp[j],如果拿了,则要放入剩下dp[j-w[i]]重量的背包里,并加上当前价值v[i]
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int dp[200000];
int main()
{
int n,i,j,m,w[100000],v[100000];
while(scanf("%d",&n))
{
for(i=0;i<n;++i)
cin>>v[i]>>w[i];
cin>>m;
for(i=0;i<n;++i)
for(j=w[i];j<=m;++j)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
cout<<dp[m]<<endl;
}
return 0;
}
原文:http://blog.csdn.net/blue_skyrim/article/details/46672359