题目描述
一天riba给学弟们讲部分和问题,讲着讲着想到一个新的问题。riba很快的解了出来。然后就问学弟会不会?
问题是这样的,给你n个整数,a1,a2 ... an。每个整数都有无限多个,问最少选择多少个数字可以使得这些数的和等于k。
输入
多组测试数据:
每一组测试数据,输入n,k;
接下来一行输入n个整数ai。
所有数据都属于[1,1000]。
输出
输出一个整数代表最少选择的数量,如果无解输出 -1。
样例输入
复制
2 3 1 1 3 2 3 4 5
样例输出
复制
3 -1
完全背包问题:
#include <stdio.h> #include <string.h> #define inf 0x3f3f3f3f #define min(x,y) ((x)<(y)?(x):(y)) int main() { int w[1005]; int dp[1005]; int n, W; while(~scanf("%d%d",&n,&W)) { memset(dp, inf, sizeof(dp)); dp[0] = 0; for(int i = 0; i < n; i++) { scanf("%d",&w[i]); } for(int i = 0; i < n; i++) { for(int j = w[i]; j <= W; j++) { dp[j] = min(dp[j], dp[j-w[i]] + 1); } } if(dp[W] == inf) dp[W] = -1; printf("%d\n",dp[W]); } return 0; }