1. 程式人生 > >2018寒假做題心得

2018寒假做題心得

一個揹包問題,因為w == v  的特性,可以用01揹包解決,設定陣列cnt來記錄硬幣使用次數

依次執行初始化一次dp陣列,然後將所以硬幣遍歷一次,,先設定目標價格,再看這個價格是否可以達到(用下標表示價格)。

轉載自http://blog.csdn.net/u012762625/article/details/43485973;

裡面還有兩種更高階的解決辦法,有空再看看

#include <stdio.h>
#include <string.h>
int dp[100005], v[105],num[105], cnt[100005];
int main() {
	int n, m, i, j;
	while(scanf("%d%d", &n, &m) != EOF && n+m) {
		int ans = 0;
		memset(dp, 0, sizeof(dp)), dp[0] = 1;
		for (i = 0; i < n; i ++) {
			scanf("%d", v + i);
		}
		for (i = 0; i < n; i ++) {
			scanf("%d", num + i);
		}
		for (i = 0; i < n; i ++) {
			memset(cnt, 0, sizeof(cnt));
			for (j = v[i]; j <= m; j ++) {
				if(dp[j-v[i]] == 1 && dp[j] == 0 && cnt[j-v[i]] < num[i]) {
					cnt[j] = cnt[j-v[i]] + 1;
					dp[j] = 1;
					ans ++;
				}
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}