DP(动态规划)背包问题

来源:互联网 发布:绘制图纸软件 编辑:程序博客网 时间:2024/05/22 14:55

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;}

原创粉丝点击