l定一定数量的不同面值的钞票Q输出由q些钞票l成的不过出款上限Q题目中的cashQ的最大金额?br />01背包问题Q请参阅Q?a href="http://www.shnenglu.com/hoolee/archive/2012/08/14/187179.html">http://www.shnenglu.com/hoolee/archive/2012/08/14/187179.html
q里我想多说一句,本题中背包的定w是题中给的cashQ每件物品的p是该钞的面|物品的hg是该U钞的面|q里的花费和价值是一L?br />以下是本题代码:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LENND 20
#define LENF 100010
typedef struct
{
int v;
int amt;
}Cash;
Cash cs[100];
int f[LENF];
int Max(int a, int b)
{
if(a > b)
return a;
return b;
}
int main()
{
int i, j;
int cash, N;
int n[LENND], D[LENND];
while(scanf("%d", &cash) != EOF)
{
scanf("%d", &N);
for(i = 0; i < N; i++)
scanf("%d%d", &n[i], &D[i]);
int count = 1;
for(i = 0; i < N; i++)
{
int M = n[i];
int t = 1;
while(M - t > 0)
{
cs[count].v = D[i];
cs[count++].amt = t;
M -= t;
t *= 2;
}
if(M != 0)
{
cs[count].v = D[i];
cs[count++].amt = M;
}
}
memset(f, 0, sizeof(f));
for(i = 1; i < count; i++)
{
int allv = cs[i].amt * cs[i].v;
for(j = cash; j >= allv; j--)
f[j] = Max(f[j], f[j - allv] + allv);
}
printf("%d\n", f[cash]);
}
//system("pause");
}

]]>