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