#include<bits/stdc++.h>usingnamespace std;int m, n;int f[209];intmain(){
cin >> m >> n;for(int i =1; i <= n; i ++){int w, v;
cin >> w >> v;for(int j = w; j <= m; j ++){
f[j]=max(f[j], f[j - w]+ v);}}
cout <<"max="<< f[m];return0;}
质数和分解
#include<bits/stdc++.h>usingnamespace std;int n, p[200];//质数表 int f[209];intmain(){for(int i =2; i <=200; i ++){bool flag =true;for(int j =2; j * j <= i; j ++){if(i % j ==0){
flag =false;break;}}if(flag) p[++ n]= i;}
f[0]=1;for(int i =1; i <= n; i ++){for(int j = p[i]; j <=200; j ++){
f[j]+= f[j - p[i]];}}int x;while(cin >> x){
cout << f[x]<< endl;}return0;}
得分膨胀
#include<bits/stdc++.h>usingnamespace std;int m, n;int f[10009];intmain(){
cin >> m >> n;for(int i =1; i <= n; i ++){int v, w;
cin >> v >> w;for(int j = w; j <= m; j ++){
f[j]=max(f[j], f[j - w]+ v);}}
cout << f[m];return0;}
邮票
#include<bits/stdc++.h>usingnamespace std;constint M =10000*200;int k, n;int f[M +10];intmain(){
cin >> k >> n;memset(f,0x3f,sizeof(f));
f[0]=0;for(int i =1; i <= n; i ++){int w;
cin >> w;for(int j = w; j <= M; j ++){
f[j]=min(f[j], f[j - w]+1);}}int i =1;while(f[i]<= k) i ++;
cout << i -1;return0;}
Piggy-Bank
#include<bits/stdc++.h>usingnamespace std;int T, E, F, n, m;int f[10009];//f[j]放在容量为j的储蓄罐得到的最小价值 intmain(){
cin >> T;while(T --){
cin >> E >> F >> n;
m = F - E;memset(f,0x3f,sizeof(f));
f[0]=0;for(int i =1; i <= n; i ++){int v, w;
cin >> v >> w;for(int j = w; j <= m; j ++){
f[j]=min(f[j], f[j - w]+ v);}}if(f[m]==0x3f3f3f3f)puts("This is impossible.");elseprintf("The minimum amount of money in the piggy-bank is %d.\n", f[m]);}return0;}
货币系统
#include<bits/stdc++.h>usingnamespace std;int m, n;longlong f[10009];intmain(){
cin >> n >> m;
f[0]=1;for(int i =1; i <= n; i ++){int w;
cin >> w;for(int j = w; j <= m; j ++){
f[j]+= f[j - w];}}
cout << f[m]<< endl;return0;}
货币系统(2)
#include<bits/stdc++.h>usingnamespace std;int T, n, cnt, a[109];bool f[25009];intmain(){
cin >> T;while(T --){
cin >> n;
cnt =0;for(int i =1; i <= n; i ++) cin >> a[i];sort(a +1, a +1+ n);memset(f,false,sizeof(f));
f[0]=true;for(int i =1; i <= n; i ++){if(f[a[i]]){
cnt ++;continue;}for(int j = a[i]; j <= a[n]; j ++){
f[j]|= f[j - a[i]];}}
cout << n - cnt << endl;}return0;}
纪念品
#include<bits/stdc++.h>usingnamespace std;constint N =109, M =10010;int t, n, m;int w[N], v[N], f[M];intmain(){
cin >> t >> n >> m;for(int i =1; i <= n; i ++) cin >> w[i];
t --;while(t --){//初始时有 j 枚金币,当天买卖后最多拥有 f[j]枚金币;如果不买不卖,金币数还是 j for(int j =1; j <= m; j ++) f[j]= j;//把 n 件物品放入容量为 m 的背包, 得到的最大价值是 f[j]//第 i 件物品的重量是 w[i], 价值是 v[i] for(int i =1; i <= n; i ++){int v;
cin >> v;for(int j = w[i]; j <= m; j ++){
f[j]=max(f[j], f[j - w[i]]+ v);}
w[i]= v;}
m = f[m];}
cout << m;return0;}
采购干草
#include<bits/stdc++.h>usingnamespace std;int n, m;int f[55009];//f[j]:n种干草 -> 重量为j的背包,花费的最小开销 intmain(){
cin >> n >> m;memset(f,0x3f,sizeof(f));
f[0]=0;for(int i =1; i <= n; i ++){int w, v;
cin >> w >> v;for(int j = w; j <= m +5000; j ++){
f[j]=min(f[j], f[j - w]+ v);}}int ans = f[m];for(int j = m; j <= m +5000; j ++){
ans =min(ans, f[j]);}
cout << ans;return0;}
#include<bits/stdc++.h>usingnamespace std;int n, m =5000*100, h;int f[500009];//f[j]花费j元所能得到的最大重量 intmain(){
cin >> n >> h;for(int i =1; i <= n; i ++){int w, v;
cin >> v >> w;//每个物品的成本是w,得到的重量是vfor(int j = w; j <= m; j ++){
f[j]=max(f[j], f[j - w]+ v);}}for(int j =1; j <= m; j ++){if(f[j]>= h){
cout << j;return0;}}return0;}
完全背包(恰好装满)
#include<bits/stdc++.h>usingnamespace std;int T, n, m;longlong f[50009];intmain(){
cin >> T;while(T --){
cin >> n >> m;memset(f,0,sizeof(0));for(int i =1; i <= n; i ++){int w, v;
cin >> w >> v;for(int j = w; j <= m; j ++){if(j == w || f[j - w]){
f[j]=max(f[j], f[j - w]+ v);}}}if(f[m]) cout << f[m]<< endl;elseputs("NO");}return0;}
完全背包问题 (模板题)#include <bits/stdc++.h>using namespace std;int m, n;int f[209];int main() { cin >> m >> n; for (int i = 1; i <= n; i ++) { int w, v; cin >> w >> v; for (int j = w; j <= m; j ++) { f[j] = m