最近重新开始学DP,今天做到多重背包这题,自己写了一个代码,感觉自己确实进步点了 ,嘻嘻。但是我没看清题意n<0 退出循环,我wa 了无数次。
下 面是自己写的代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>
#define eps 1e-9
#define N 100
#define P system("pause")
using namespace std;
int n;
struct node {
int w;
int num;
}a[N];
int dp[300000];
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);cc
int i,sum,k,j;
while(scanf("%d",&n))
{
if(n<0) break;
sum=0;
for(i=0;i<n;i++){
scanf("%d%d",&a[i].w,&a[i].num);
sum+=a[i].w*a[i].num;
}
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
for(k=0;k<a[i].num;k++)
for(j=sum/2;j>=a[i].w;j--)
dp[j]=max(dp[j],dp[j-a[i].w]+a[i].w);
printf("%d %d\n",sum-dp[sum/2],dp[sum/2]);
}
// P;
return 0;
}
模板代码如下:
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>
#define eps 1e-9
#define N 100
#define P system("pause")
using namespace std;
int n,sum;
struct node {
int w;
int num;
}a[N];
int dp[300000];
void ozbag(int cost,int value)
{
for(int i=sum;i>=cost;i--)
dp[i]=max(dp[i],dp[i-cost]+value);
}
void completebag(int cost,int value)
{
for(int i=cost;i<=sum;i++)
dp[i]=max(dp[i],dp[i-cost]+value);
}
void multbag(int cost,int value,int amount)
{
if(amount*cost>=sum)
{
completebag(cost,value);
return ;
}
int k=1;
while(k<=amount)
{
ozbag(k*cost,k*value);
amount-=k;
k*=2;
}
ozbag(k*cost,k*value);
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);cc
int i,k,j;
while(scanf("%d",&n))
{
if(n==-1) break;
sum=0;
for(i=0;i<n;i++){
scanf("%d%d",&a[i].w,&a[i].num);
sum+=a[i].w*a[i].num;
}
memset(dp,0,sizeof(dp));
int z=sum;
sum/=2;
for(i=0;i<n;i++)
multbag(a[i].w,a[i].w,a[i].num);
printf("%d %d\n",z-dp[sum],dp[sum]);
}
// P;
return 0;
}