标签:des style blog class c code
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 26172 | Accepted: 9238 |
Description
Input
Output
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
Hint
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 #define N 100003 5 int c[N],w[N]; 6 int dp[N]; 7 int n, v; 8 void ZeroOnePack(int cost,int weight) //01背包 9 { 10 for(int k=v; k>=cost; k--) 11 dp[k] = max(dp[k],dp[k-cost]+weight); 12 } 13 void CompeletPack(int cost,int weight) //完全背包 14 { 15 for(int k=cost; k<=v; k++) 16 dp[k] = max(dp[k],dp[k-cost]+weight); 17 } 18 void MultiplePack(int cost,int weight,int amount) //多重背包 19 { 20 if(cost*amount>=v) 21 { 22 CompeletPack(cost,weight); 23 return; 24 } 25 else 26 { 27 int k=1; 28 while(k<amount) 29 { 30 ZeroOnePack(k*cost,k*weight); 31 amount = amount-k; 32 k=k*2; 33 } 34 ZeroOnePack(amount*cost,amount*weight); 35 } 36 } 37 int main() 38 { 39 int i; 40 while(scanf("%d %d",&v,&n)!=EOF) 41 { 42 int totle = 0; 43 int min = 100002; 44 for(i=0; i<n; i++) 45 { 46 scanf("%d%d",&w[i],&c[i]); //每种金币的个数和金币面值 47 totle += w[i]*c[i]; 48 if(min>c[i]) 49 min = c[i]; 50 } 51 if(totle<v) //如果金币的总量小于输入的v,直接将totle输出 52 { 53 printf("%d\n",totle); 54 continue; 55 } 56 if(v<min)//如果v小于金币的最小值,则直接输出0 57 { 58 printf("0\n"); 59 continue; 60 } 61 memset(dp,0,sizeof(dp)); 62 for (i=0; i<n; i++) 63 { 64 if(w[i]*c[i] == v) 65 { 66 dp[v] = v; 67 break; 68 } 69 else 70 MultiplePack(c[i],c[i],w[i]);//多重背包 71 } 72 73 printf("%d\n",dp[v]); 74 } 75 return 0; 76 }
Poj 1276 Cash Machine,布布扣,bubuko.com
标签:des style blog class c code
原文地址:http://www.cnblogs.com/yazhou/p/3737757.html