1.01背包变形
http://codeup.cn/problem.php?cid=100000631&pid=0
二维会超限,需要变成滚动数组,01背包的滚动数组逆序,完全背包正序。
dp[i]表示考虑到前i个所能达到的不超过v的最大重量,最后输出,用v减即可
#include<bits/stdc++.h>
using namespace std;
#define MaxSize 20020
int dp[MaxSize];
int main(){
int v;cin>>v;
int n;cin>>n;
int* a = new int[n+1];
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=0;i<=v;i++){
dp[i]=0;
}
for(int i=1;i<=n;i++){
for(int vt=v;vt>=a[i];vt--){
dp[vt]=max(dp[vt],dp[vt-a[i]]+a[i]);
}
}
cout<<v-dp[v];
return 0;
}
http://codeup.cn/problem.php?cid=100000631&pid=1
典型的01背包问题
#include<bits/stdc++.h>
using namespace std;
int dp[10010];
int t[110];
int v[110];
int main(){
int T,M;
cin>>T>>M;
for(int i=1;i<=M;i++){
cin>>t[i]>>v[i];
}
for(int i=0;i<10010;i++){
dp[i]=0;
}
for(int i=1;i<=M;i++){
for(int j=T;j>=t[i];j--){
dp[j]=max(dp[j],dp[j-t[i]]+v[i]);
}
}
cout<<dp[T];
return 0;
}
3.http://codeup.cn/problem.php?cid=100000631&pid=2
一定要注意循环的控制条件,数组代表的含义
又被多组数据坑,前面两个题都是一次数据。
看题干,灵活
#include<bits/stdc++.h>
using namespace std;
long long dp[10010];
int a[30];
int main(){
int V,N;
while(cin>>V>>N){
for(int i=1;i<=V;i++)
cin>>a[i];
dp[0]=1;
for(int i=1;i<=N;i++){
dp[i]=0;
}
for(int i=1;i<=V;i++){
for(int j=a[i];j<=N;j++){
dp[j]=dp[j]+dp[j-a[i]];
}
}
cout<<dp[N]<<endl;
}
return 0;
}