大大的去了:
洛谷P1049
二维数组题解:
#include<bits/stdc++.h> using namespace std; int main() { int v,n;//V表示箱子容量,n表示物品数量 int a[35];//物品体积 int f[35][20005]; cin>>v>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) for(int j=a[i];j<=v;j++) //或者:for(int j=v;j>=a[i];j--)// f[i][j]=max(f[i-1][j],f[i-1][j-a[i]]+a[i]); cout<<v-f[v];//注意,要输出剩余体积,而不是f[v]! }
一维数组题解:
#include<iostream> using namespace std; int v,n; int s[40]; int f[2000020]; int main() { cin>>v>>n; for(int i=1;i<=n;i++) cin>>s[i]; for(int i=1;i<=n;i++) { for(int j=v;j>=s[i];j--) { if(f[j]<f[j-s[i]]+s[i]) { f[j]=f[j-s[i]]+s[i]; } } } cout<<v-f[v]; return 0; }
第二题:
洛谷P1164
按照大佬们的说法,这是一题奇妙的01背包水题
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> using namespace std; const int maxn=10000+10; int v[maxn],f[maxn]; int main(){ int n,m; cin>>n>>m; f[0]=1; for(int i=1;i<=n;++i) cin>>v[i];//读入 价值 for(int i=1;i<=n;++i) for(int j=m;j>=v[i];--j) f[j]+=f[j-v[i]];//现在的花费+=我不点这个菜的时候的花费 cout<<f[m]<<endl;最后把最后一个点的花费输出来就可以了 return 0; }