1. 程式人生 > >poj1276--Cash Machine--多重背包

poj1276--Cash Machine--多重背包

lap cas pen 意思 lose esp != color pri

Description

假設你現在有現金cash,有n種商品,給定你它們各自的價格和數量。如果你想盡可能多地購買商品,請求出最多能買商品的總價值。

Sample Input

735 3 4 125 6 5 3 350
633 4 500 30 6 100 1 5 0 1
735 0
0 3 10 100 10 50 10 10

Sample Output

735

630

0

0

題解:

  最近真的在水題耶ww(居然好意思說)

  莫名其妙因為cash==0||n==0的情況WA了兩次……其實不寫就好了qwq

  就是一個多重背包的裸題吧,dp[j]表示當前容量為j時,最多能花出去的錢數。sum[j]表示的是當前物品購買的數量。

技術分享
 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cstring>
 6 using namespace std;
 7 const int maxn=100009;
 8 int f[maxn],g[maxn];
 9 int cash,n,w[maxn],num[maxn],sum[maxn],ans=0;
10 int main()
11 {
12     while(scanf("%d%d",&cash,&n)!=EOF)
13 { 14 for(int i=1;i<=n;i++) 15 scanf("%d%d",&num[i],&w[i]); 16 f[0]=0; 17 memset(f,0,sizeof(f)); 18 for(int i=1;i<=n;i++) 19 { 20 memset(sum,0,sizeof(sum)); 21 for(int j=w[i];j<=cash;j++) 22 { 23
if(f[j]<f[j-w[i]]+w[i]&&sum[j-w[i]]+1<=num[i]) 24 { 25 sum[j]=sum[j-w[i]]+1; 26 f[j]=f[j-w[i]]+w[i]; 27 } 28 } 29 } 30 printf("%d\n",f[cash]); 31 } 32 return 0; 33 }
View Code

poj1276--Cash Machine--多重背包