poj 2063 Investment(完全背包)

来源:互联网 发布:java 查看线程状态 编辑:程序博客网 时间:2024/05/22 10:29

多次完全背包
要对背包的容量进行压缩,不然超内存
因为债券的价格都是1000的倍数,就除1000来压缩

#include <stdio.h>#include <string.h>#define max(a,b) (a)>(b)?(a):(b)int w[15];int v[15];int dp[50000];int W,n;void solve(){    for(int i = 0; i < n; ++i)        for(int j = w[i]; j <= W; ++j)            dp[j] = max(dp[j],dp[j-w[i]]+v[i]);}int main(){    int T,y,sum;    scanf("%d",&T);    while(T--)    {        scanf("%d %d",&sum,&y);        scanf("%d",&n);        for(int i = 0; i < n; ++i)        {            scanf("%d %d",&w[i],&v[i]);            w[i] /= 1000;        }        while(y--)        {            W = sum/1000;            memset(dp,0,sizeof(dp));            solve();            sum += dp[W];        }        printf("%d\n",sum);    }    return 0;}