0-1背包问题
将一个容量为V的背包,物品有两个属性,一个w和一个v表示体积和属性值。每种物品只有一个。要求装下尽可能多,求最大价值。
转移状态方程:
dp[j]=max(dp[dp[j-list[i].w]+list[i].v,dp[j-1])
#include <iostream>
#include<stdio.h>
using namespace std;
struct E{
int w;
int v;
}list[2001];
int dp[101];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int s,n;
scanf("%d%d",&s,&n);
int count=0;//total numbers
for(int i=1;i<=n;i++)
{//input
int v,w,k;
scanf("%d%d%d",&w,&v,&k);
int c=1;
while(k-c>0)
{
k-=c;
list[++count].w=w*c;
list[count].v=c*v;
c*=2;
}
list[++count].w=w*k;
list[count].v=v*k;
}
for(int i=1;i<=s;i++){dp[i]=0;}//init
for(int i=1;i<=count;i++)
{
for(int j=s;j>=list[i].w;j--)
{
dp[j]=max(dp[j],dp[j-list[i].w]+list[i].v);
}
}
printf("%d\n",dp[s]);
}
return 0;
}