标签:des blog io ar os 使用 sp for div
Description
Input
Output
Sample Input
3 7 40 3 5 23 8 2 52 6
Sample Output
48
把多重背包转化为01背包
#include<cstdio>//把多重背包转化为01背包 #include<iostream> #include<cstring> #include<algorithm> using namespace std; struct DP { int h,a,c; }; DP num[400+10]; int dp[40000+100]; int cmp(DP x,DP y) { return x.a<y.a; } int main() { int n,i,j,k; while(scanf("%d",&n)!=EOF) { memset(dp,0,sizeof(dp)); dp[0]=1; for(i=1;i<=n;i++) { scanf("%d%d%d",&num[i].h,&num[i].a,&num[i].c); } sort(num+1,num+n+1,cmp); for(i=1;i<=n;i++) { for(j=1;j<=num[i].c;j++) { for(k=num[i].a;k>=0;k--) { if(dp[k]==1&&k+num[i].h<=num[i].a) { dp[k+num[i].h]=1; } } } } for(i=40000;i>=0;i--) { if(dp[i]==1) break; } printf("%d\n",i); } return 0; }
直接使用多重背包
#include <cstring> #include <cmath> #include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <iostream> using namespace std; int n,dp[45000]; struct node { int a,b,c; }e[500]; bool cmp(node a, node b) { return a.b < b.b; } int main() { int i,j,k; while(scanf("%d",&n)!=EOF) { for(i = 0; i < n ; i++) { scanf("%d %d %d",&e[i].a,&e[i].b,&e[i].c); } memset(dp, -1 , sizeof(dp)); sort(e,e + n, cmp); dp[0] = 1; for(i = 0; i < n; i++) { int sum = 1; int q; for( k = 1; k<=e[i].c; k *= 2) { q = k * e[i].a; for(j = e[i].b; j >=0; j --) { if(dp[j] != -1 && j + q <= e[i].b) { dp[j + q] = 1; } } e[i].c -= k; } q = e[i].c * e[i].a; for(j = e[i].b; j >=0; j --) { if(dp[j] != -1 && j + q <= e[i].b) { dp[j + q] = 1; } } } for(i = 40000; i >= 0; i--) { if(dp[i] == 1) break; } cout<<i<<endl; } return 0; }
标签:des blog io ar os 使用 sp for div
原文地址:http://www.cnblogs.com/sola1994/p/4090444.html