poj1276--Cash Machine--多重背包
阿新 • • 發佈:2017-09-01
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)View Code13 { 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 { 23if(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 }
poj1276--Cash Machine--多重背包