标签: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