3 3 3 7 7 9 9 10 5 1 1 5 3 10 3 6 8 7 5 6
10 20 题目分析: 裸的0—1背包问题,状态转化方程为: dp[j]=max(dp[j],dp[j-b[i]]+a[i]);对于每一个物品,吃还是不吃, 有两种途径的来源。 AC代码:/** *@xiaoran *背包问题 */ #include<iostream> #include<cstdio> #include<map> #include<cstring> #include<string> #include<algorithm> #include<queue> #include<vector> #include<stack> #include<cstdlib> #include<cctype> #include<cmath> #define LL long long using namespace std; const int maxn=105; int a[maxn],b[maxn],dp[100005]; int main() { int n,m; while(~scanf("%d",&n)){ for(int i=0;i<n;i++){ scanf("%d%d",&a[i],&b[i]); } scanf("%d",&m); memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++){ for(int j=b[i];j<=m;j++){//装或者不装 dp[j]=max(dp[j],dp[j-b[i]]+a[i]);//消耗卡路里,增加幸福值 } } printf("%d\n",dp[m]); } return 0; }
原文地址:http://blog.csdn.net/fool_ran/article/details/42527997