题意:给定最大的价值,存在N种物品,分别告诉你数量和价值,问这些物品能组成的小于或等于最大价值的价值
即讲物品以2的次方进行划分,假设物品数为34,则划分为1,2,4,8,16,3,5种不同的物品,这5种物品的价值为原物品的数量*原物品的价值,转化成01背包问题
#include<stdio.h>
#include<string.h>
int Contain,N;
int Amount[11];
int Value[11];
int DP[100001];
int main(){
int i,j,k;
while(~scanf("%d",&Contain)){
memset(DP,0,sizeof(DP));
scanf("%d",&N);
DP[0]=1;
for(i=1;i<=N;i++)
scanf("%d %d",&Amount[i],&Value[i]);
for(i=1;i<=N;i++){
j=1;
while(j<=Amount[i]){
for(k=Contain;k>=j*Value[i];k--){
if(DP[k-j*Value[i]])
DP[k]=1;
}
Amount[i]-=j;
j<<=1;
}
for(k=Contain;k>=Amount[i]*Value[i];k--){
if(DP[k-Amount[i]*Value[i]])
DP[k]=1;
}
}
for(i=Contain;i>=0;i--)
if(DP[i])
break;
printf("%d\n",i<0?0:i);
}
return 0;
}