poj 1283 DP
分析:典型dp,状态转移方程dp[i][j]=dp[i-1][j-1]+dp[i][j-i];dp[i][j]表示i辆卡车装j台电脑的方法数。
例如:8台电脑3台车
卡车1 | 卡车2 | 卡车3 | dp[3,8]=dp[2,7]+dp[3,5] | |
第一类 | 6 | 1 | 1 | 卡车3只放一台电脑,运法总数相当于 2台卡车运7台电脑dp[2,7]。 |
5 | 2 | 1 | ||
4 | 3 | 1 | ||
第二类 | 4 | 2 | 2 | 每台车有一台以上电脑,运法总数相当于 3台车运5台电脑dp[3,5] |
3 | 3 | 2 |
c++
View Code
#include<stdio.h>
#include<string.h>
__int64 dp[210][210];
void init()
{
int i;
for(i=1;i<=200;i++)
{
dp[i][i]=dp[1][i]=dp[i][0]=dp[0][i]=1;
}
for(i=2;i<=200;i++)
{
for(int j=i+1;j<=200;j++)
{
dp[i][j]=dp[i-1][j-1]+dp[i][j-i];
}
}
}
int main()
{
int n,k,i,j;
init();
while(scanf("%d%d",&n,&k),n||k)
{
printf("%I64d\n",dp[k][n]);
}
return 0;
}
java
View Code
import java.io.*;
import java.util.*;
import java.math.*;
public class Main{
static long dp[][]=new long[210][210];
static void init()
{
int i;
for(i=1;i<=200;i++)
{
dp[i][i]=dp[1][i]=dp[i][0]=dp[0][i]=1;
}
for(i=2;i<=200;i++)
{
for(int j=i+1;j<=200;j++)
{
dp[i][j]=dp[i-1][j-1]+dp[i][j-i];
}
}
}
public static void main(String args[]){
Scanner cin=new Scanner(System.in);
int n,k;
init();
while(cin.hasNext())
{
n=cin.nextInt();
k=cin.nextInt();
if(n==0&&k==0) break;
System.out.println(dp[k][n]);
}
}
}