标签:
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 28337 | Accepted: 10113 |
Description
Input
Output
Sample Input
735 3 4 125 6 5 3 350 633 4 500 30 6 100 1 5 0 1 735 0 0 3 10 100 10 50 10 10
Sample Output
735 630 0 0
Hint
Source
//600K 79MS
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[100007];
int weight[10007],value[10007];
int main()
{
int sum,n;
while(scanf("%d%d",&sum,&n)!=EOF)
{
int a,b,num=0;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)//进行二分优化
{
scanf("%d%d",&a,&b);
for(int j=1;j<=a;j<<=1)
{
value[num]=weight[num]=j*b;
num++;
a-=j;
}
if(a>0)
{
value[num]=weight[num]=a*b;
num++;
}
}
for(int i=0;i<num;i++)
for(int j=sum;j>=weight[i];j--)
dp[j]=max(dp[j-weight[i]]+value[i],dp[j]);
printf("%d\n",dp[sum]);
}
return 0;
}
//524K 63MS
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[100007],num[17],weight[17];
int sum;
void ZeroOnePack(int cost)
{
for(int i=sum;i>=cost;i--)
dp[i]=max(dp[i],dp[i-cost]+cost);
}
void CompletePack(int cost)
{
for(int i=cost;i<=sum;i++)
dp[i]=max(dp[i],dp[i-cost]+cost);
}
void MultiplePack(int count,int cost)
{
if(count*cost>sum)CompletePack(cost);
else
{
int k=1;
while(k<count)
{
ZeroOnePack(k*cost);
count-=k;
k<<=1;
}
ZeroOnePack(count*cost);
}
}
int main()
{
int n;
while(scanf("%d%d",&sum,&n)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d%d",&num[i],&weight[i]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
MultiplePack(num[i],weight[i]);
printf("%d\n",dp[sum]);
}
}
POJ 1276 Cash Machine 多重背包--二进制优化
标签:
原文地址:http://blog.csdn.net/crescent__moon/article/details/43058393