POJ 1276 (DP)
题目:http://poj.org/problem?id=1276
背包问题。
看指定的货币能组合成哪些情况。钱最多且<=cash的即是答案。
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> int a[11],type[11],m[100001]; int main() { int money,num,i,j,k; while(~scanf("%d%d",&money,&num)) { for(i =0 ; i < num ; ++i) { scanf("%d%d",&a[i],&type[i]); m[type[i]] = 1; } memset(m,0,sizeof(m)); m[0] = 1; for(i = 0 ; i < num ; ++i)//几种货币 { for(j = money ; j >= 0 ; --j) if(m[j]) { for(k = 1; k <= a[i]; ++k) { if(j + k*type[i] > money) break; m[j+k*type[i]] = 1; //可以得到 j+k*type[i] } } } for(i = money ; i >= 0 ; --i) if(m[i]) { printf("%d\n",i); break; } } // system("pause"); return 0; }